package top.byfree.jbyan.saber.bean

import org.ktorm.database.Database
import org.ktorm.entity.sequenceOf
import org.ktorm.schema.Table
import org.ktorm.schema.datetime
import org.ktorm.schema.int
import org.ktorm.schema.varchar
import top.byfree.jbyan.saber.bean.Perms.bindTo
import top.byfree.jbyan.saber.bean.pojo.*

/**
 * orm 映射
 *
 * @author jbyan
 * @since 20/3/2024
 */

/**
 * 用户表映射
 *
 * @see User
 */
object Users : Table<User>("saber_user") {
    /* 用户编号 */
    var userId = varchar("user_id").primaryKey().bindTo(User::userId)

    /* 头像 */
    var avatar = varchar("avatar").bindTo(User::avatar)

    /* 用户名称 */
    var username = varchar("username").bindTo(User::username)

    /* 用户昵称 */
    var nickname = varchar("nickname").bindTo(User::nickname)

    /* 用户密码 */
    var password = varchar("password").bindTo(User::password)

    /* 用户签名 */
    var sign = varchar("sign").bindTo(User::sign)

    /* 邮箱 */
    var email = varchar("email").bindTo(User::email)

    /* 逻辑删除 */
    var isDelete = int("is_delete").bindTo(User::isDelete)
    /* 用户状态 */
    var status = int("status").bindTo(User::status)

    /* 创建日期 */
    var gmtCreate = datetime("gmt_create").bindTo(User::gmtCreate)

    /* 修改日期 */
    var gmtModify = datetime("gmt_modify").bindTo(User::gmtModify)

    /* 创建人 */
    var createBy = varchar("create_by").bindTo(User::createBy)

    /* 修改人 */
    var modifyBy = varchar("modify_by").bindTo(User::modifyBy)
}

/**
 * 用户角色关联表
 *
 * @see UserRole
 */
object UserRoles : Table<UserRole>("saber_user_role") {
    /* 用户Id */
    var userId = varchar("user_id").primaryKey().bindTo(UserRole::userId)

    /* 角色Id */
    var roleId = varchar("role_id").primaryKey().bindTo(UserRole::roleId)
}

/**
 * 角色表
 *
 * @see Role
 */
object Roles : Table<Role>("saber_role") {
    /* 角色Id */
    var roleId = varchar("role_id").primaryKey().bindTo(Role::roleId)

    /* 角色标识 */
    var roleKey = varchar("role_key").bindTo(Role::roleKey)

    /* 角色名称 */
    var roleName = varchar("role_name").bindTo(Role::roleName)

    /* 状态 */
    var status = int("status").bindTo(Role::status)

    /* 删除标识 */
    var isDelete = int("is_delete").bindTo(Role::isDelete)

    /* 创建日期 */
    var gmtCreate = datetime("gmt_create").bindTo(Role::gmtCreate)

    /* 修改日期 */
    var gmtModify = datetime("gmt_modify").bindTo(Role::gmtModify)

    /* 创建人 */
    var createBy = varchar("create_by").bindTo(Role::createBy)

    /* 修改人 */
    var modifyBy = varchar("modify_by").bindTo(Role::modifyBy)
}

/**
 * 角色权限关系表
 *
 * @see RolePerm
 */
object RolePerms : Table<RolePerm>("saber_role_perm") {
    /* 角色Id */
    var roleId = varchar("role_id").primaryKey().bindTo(RolePerm::roleId)
    /* 权限Id */
    var permId = varchar("perm_id").primaryKey().bindTo(RolePerm::permId)
}

/**
 * 权限表
 *
 * @see Perm
 */
object Perms : Table<Perm>("saber_perm") {
    /* 权限Id */
    var permId = varchar("perm_id").primaryKey().bindTo(Perm::permId)
    /* 权限标识 */
    var permKey = varchar("perm_key").bindTo(Perm::permKey)
    /* 权限名称 */
    var permName = varchar("perm_name").bindTo(Perm::permName)
    /* 权限状态 */
    var status = int("status").bindTo(Perm::status)
    /* 删除标识 */
    var isDelete = int("is_delete").bindTo(Perm::isDelete)
    /* 创建日期 */
    var gmtCreate = datetime("gmt_create").bindTo(Perm::gmtCreate)
    /* 修改日期 */
    var gmtModify = datetime("gmt_modify").bindTo(Perm::gmtModify)
    /* 创建日期 */
    var createBy = varchar("create_by").bindTo(Perm::createBy)
    /* 修改日期 */
    var modifyBy = varchar("modify_by").bindTo(Perm::modifyBy)
}

/**
 * 菜单表
 *
 * @see Menu
 */
object Menus : Table<Menu>("saber_menu") {
    /* 菜单Id */
    var menuId = varchar("menu_id").primaryKey().bindTo(Menu::menuId)
    /* 菜单名称 */
    var menuName = varchar("menu_name").bindTo(Menu::menuName)
    /* 父Id */
    var parentId = varchar("parent_id").bindTo(Menu::parentId)
    /* 权限 */
    var perms = varchar("perms").bindTo(Menu::perms)
    /* 路径 */
    var path = varchar("path").bindTo(Menu::path)
    /* 是否外链 */
    var isFrame = int("is_frame").bindTo(Menu::isFrame)
    /* 菜单类型 */
    var menuType = varchar("menu_type").bindTo(Menu::menuType)
    /* 按钮类型 */
    var btnType = varchar("btn_type").bindTo(Menu::btnType)
    /* 是否可见 */
    var visible = int("visible").bindTo(Menu::visible)
    /* 状态 */
    var status = int("status").bindTo(Menu::status)
    /* 图标 */
    var icon = varchar("icon").bindTo(Menu::icon)
    /* 创建时间 */
    var gmtCreate = datetime("gmt_create").bindTo(Menu::gmtCreate)
    /* 修改时间 */
    var gmtModify = datetime("gmt_modify").bindTo(Menu::gmtModify)
    /* 备注 */
    var remark = varchar("remark").bindTo(Menu::remark)
    /* 排序 */
    var orderNum = int("order_num").bindTo(Menu::orderNum)
    /* 创建人 */
    var createBy = varchar("create_by").bindTo(Menu::createBy)
    /* 修改人 */
    var modifyBy = varchar("modify_by").bindTo(Menu::modifyBy)
    /*  组件 */
    var component = varchar("component").bindTo(Menu::component)
    /* 删除标识 */
    var isDelete = int("is_delete").bindTo(Menu::isDelete)
}

val Database.user get() = this.sequenceOf(Users)
val Database.userRole get() = this.sequenceOf(UserRoles)
val Database.role get() = this.sequenceOf(Roles)
val Database.rolePerm get() = this.sequenceOf(RolePerms)
val Database.perm get() = this.sequenceOf(Perms)
val Database.menu get() = this.sequenceOf(Menus)

